package com.woniuxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.entity.AllType;
import com.woniuxy.entity.DTO.TypeQueryDTO;
import com.woniuxy.entity.VO.TypeCountVO;
import com.woniuxy.mapper.TypeMapper;
import com.woniuxy.service.ITypeService;
import com.woniuxy.util.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/16 16:31
 * @Description TODO
 * 标签服务实现类
 * 实现标签相关的业务逻辑
 * 继承ServiceImpl获取基础CRUD实现
 */
@Service
public class TypeServiceImpl extends ServiceImpl<TypeMapper, AllType> implements ITypeService {

    @Autowired
    private TypeMapper typeMapper;

    /**
     * 分页多条件查询标签列表
     * 使用MyBatis-Plus的分页插件和条件构造器实现复杂查询
     * @param queryDTO 查询条件和分页参数
     * @return 分页结果对象
     */
    @Override
    public PageResult<AllType> getTypeList(TypeQueryDTO queryDTO) {
        // 创建分页对象，设置当前页码和每页数量
        // 使用构造函数而非setter方法，代码更简洁且避免null值问题
        Page<AllType> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());

        // 创建查询条件构造器
        // 使用QueryWrapper而非LambdaQueryWrapper，因为表字段与实体属性一致
        QueryWrapper<AllType> queryWrapper = new QueryWrapper<>();

        // 标签名称模糊查询
        // 只有当查询参数不为空且不为空字符串时才添加条件，避免SQL错误
        if (queryDTO.getTypeName() != null && !queryDTO.getTypeName().isEmpty()) {
            queryWrapper.like("type", queryDTO.getTypeName());
        }

        // 按标签ID升序排序
        // 确保查询结果有固定顺序，提升用户体验
        queryWrapper.orderByAsc("type_id");

        // 执行分页查询
        // 调用MyBatis-Plus提供的selectPage方法，自动处理分页逻辑
        IPage<AllType> typePage = typeMapper.selectPage(page, queryWrapper);

        // 封装分页结果
        // 转换为项目自定义的PageResult对象，统一API返回格式
        PageResult<AllType> pageResult = new PageResult<>();
        pageResult.setPageNum(queryDTO.getPageNum());
        pageResult.setPageSize(queryDTO.getPageSize());
        pageResult.setTotal(typePage.getTotal());
        pageResult.setPages((int) typePage.getPages());
        pageResult.setList(typePage.getRecords());

        return pageResult;
    }


    @Override
    public List<TypeCountVO> getTypeDistribution() {
        return typeMapper.selectTypeDistribution();
    }
}